Example Plug-in Package

This example will walk through creating and packaging a simple MAXScript-based plug-in that has assorted assets configured as components in the PackageContents.xml file, using the Autodesk Application Plug-in Package format.

Consider this simple MAXScript macroScipt, called new_menu_demo.ms, that creates a menu item with an icon:

-- create a menu w/ an icon
macroScript demo_icon_menu category: "mxs docs" tooltip:"Demo Icon Menu"
IconName:"test1"
(
    helloWorld ("MAXScript Menu")
)

myTestMenu = menuMan.findMenu "Demo Menu"
myAction = menuMan.createActionItem "demo_icon_menu" "mxs docs"
myTestMenu.addItem myAction (myTestMenu.numItems()+1)
menuMan.updateMenuBar()

Note that a "Demo Menu" item must be present in the UI for this script to add an item to. You can add one using the Customize UI dialog for testing.

We can create a the PackageContents.xml file for the above macro script that looks like this:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationPackage 
    SchemaVersion="1.0" 
    AutodeskProduct="3ds Max" 
    ProductType="Application" 
    Name="My 3ds Max Plugin"
    AppVersion="1.0.0"
    ProductCode="{caedfa12-cf58-4188-a22b-e4cf2e52baa2}" 
    UpgradeCode="{68b04f36-d00b-436e-9386-7337afcffa4a}">
    <CompanyDetails />
    <Components Description="post-start-up scripts parts">
        <RuntimeRequirements OS="Win64" Platform="3ds Max" SeriesMin="2018" SeriesMax="2020" />
        <ComponentEntry AppName="DemoMenu" Version="1.0.0" ModuleName="./post_startup_scripts/new_menu_demo.ms" />
    </Components>
</ApplicationPackage>

Here we specify a single component, a "post-start-up script". Note that there are two types of start-up script parts. In this case, we run post start up, after the UI system has initialized, because we need to have menus present.

Create the following folder and file structure for testing:
C:\Test\NewMenuDemo\PackageContents.xml
C:\Test\NewMenuDemo\post_startup_scripts\new_menu_demo.ms
Set the ADSK_APPLICATION_PLUGINS environment variable to C:\Test\

Launch 3ds Max to confirm that the script loads properly.

To add the icon used by the plug-in, we need to set additional paths for 3ds Max to search for icons in. A plug-in should set both light and dark theme paths, even if the icons are the same for both themes. Our script is looking for a multi-resolution icon named "test1", so we will create an icon directory inside the package directory for each theme, and put the icons in them.
C:\Test\NewMenuDemo\icons\dark\test1.ico
C:\Test\NewMenuDemo\icons\light\test1.ico

We then add these components to the PackageContents.xml:

<Components Description="light icon paths parts">
    <RuntimeRequirements OS="Win64" Platform="3ds Max" SeriesMin="2018" SeriesMax="2020" />
    <ComponentEntry AppName="lighticons" Version="1.0.0" ModuleName="./icons/Light" />
</Components>
<Components Description="dark icon paths parts">
    <RuntimeRequirements OS="Win64" Platform="3ds Max" SeriesMin="2018" SeriesMax="2020" />
    <ComponentEntry AppName="darkicons" Version="1.0.0" ModuleName="./icons/Dark" />
</Components>

Adding more components involves adding the item to the package directory, and then adding a component entry to the PackageContents.xml file. For example, we can add another MAXScript called by our menu, called mxs_function.ms:

fn helloWorld msg = (
    format "Hello world %\n" msg
)

Because there is no dependency on a UI in this script, we can add it to the pre-start-up scripts:

    <Components Description="pre-start-up scripts parts">
        <RuntimeRequirements OS="Win64" Platform="3ds Max" SeriesMin="2018" SeriesMax="2020" />
        <ComponentEntry AppName="DemoMenu" Version="1.0.0" ModuleName="./pre_startup_scripts/mxs_function.ms" />
    </Components>

Once you have tested that the package loads from the test folder, you can create a zip archive for upload to the Autodesk App Store, or add it to an installer for distribution to 3ds Max users, and install to one of the locations described in the Packaging Plug-ins topic.